package com.example.design_pattern.singleton;

/**
 * 什么是单例模式
 * 单例模式是一种设计模式，用于确保类只有一个实例，并提供全局访问点。这意味着无论在程序的哪个地方，只要需要该类的实例，都可以获取到同一个实例。这通常用于那些需要在整个应用程序中共享状态或提供全局服务的类。
 *
 * 单例模式通常包括以下几个要素：
 * 1. 私有静态成员变量：用于保存类的唯一实例。
 * 为什么这个必须要是静态的呢？应为3中那个对外提供实例的方法必须是静态的。具体3中有说为什么。而，3中静态方法，是不能使用非静态的成员变量的，所以，反过来要求，1也必须是静态的。
 *
 * 2. 私有构造函数：确保其他类无法直接实例化该类。
 * 通过将类的构造函数设为私有，可以防止其他类直接调用该构造函数来创建该类的实例。私有构造函数只能在类的内部被访问，外部无法访问。这样做的目的是确保该类的实例只能通过特定的方法来获取，从而控制实例的数量，保证单例模式的实现。
 *
 * 3. 公有静态方法：提供全局访问点，用于获取类的实例。
 * 这个方法必须是静态的，因为静态方法可以在没有创建类实例的情况下直接调用。单例模式的目标是在整个应用程序中只有一个实例，所以必须通过一个方法来获取该实例。静态方法不需要通过类的实例来调用，而是直接通过类名调用，因此可以作为全局访问点，用于获取单例实例。
 * 因为你在类里面本身自己就调用了一次自己的构造方法，已经有一个实例了。那么，后续，就不同再创建实例。而如果不是静态方法，则必须通过实例来调用，而此刻我们调用这个方法本来就是想要拿到实例，那不就是无解鸡生蛋蛋生鸡的问题了。所以必须要是静态方法。
 *
 * 常见的单例模式实现包括懒汉式单例、饿汉式单例、双重检查锁定单例等。每种实现方式都有其适用的场景和特点。
 * */

//1、饿汉式—静态常量方式（线程安全）
// 为什么要叫饿汉式
// 饿汉式单例被称为"饿汉式"是因为它在类加载时就立即创建实例(也就是new Singleton01()会执行)，不管是否会被使用到。
// 这种方式就像是一个"饿汉"一样，无论是否需要，一开始就准备好了。

// 为什么饿汉式单例，是线程安全的呢
// 类加载时就初始化实例，避免了多线程同步问题。天然线程安全。
// 饿汉式单例在类加载时就创建了实例，并且在整个生命周期中始终存在，因此不会存在多线程并发访问创建实例的情况，从而保证了线程安全性。
// 因为类加载过程是由类加载器负责的，并且类加载过程是线程安全的，所以饿汉式单例也就是线程安全的。
public class Singleton01Hungry {

    // 私有静态成员变量：用于保存类的唯一实例。
    private static Singleton01Hungry instance = new Singleton01Hungry();

    //私有构造函数：确保其他类无法直接实例化该类。
    private Singleton01Hungry(){}

    // 公有静态方法：提供全局访问点，用于获取类的实例。
    public static Singleton01Hungry getInstance() {
        return instance;
    }
}
